#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

#define SHM_SIZE 1024  // 共享内存的大小（字节）

int main() {
    // Step 1: 创建唯一的键值
    key_t key = ftok("shmfile", 65);  // 使用ftok生成一个唯一的key
    if (key == -1) {
        perror("ftok failed");
        exit(1);
    }

    // Step 2: 创建共享内存段
    int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);  // 0666代表读写权限
    if (shmid == -1) {
        perror("shmget failed");
        exit(1);
    }

    // Step 3: 创建子进程
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        // 子进程：写入数据到共享内存
        char *data = (char*) shmat(shmid, NULL, 0);  // 连接到共享内存
        if (data == (char *)(-1)) {
            perror("shmat failed");
            exit(1);
        }

        printf("子进程：写入数据到共享内存...\n");
        strcpy(data, "Hello, Shared Memory! This is child process writing.");
        printf("子进程：数据写入完成，内容为：%s\n", data);

        // 分离共享内存
        if (shmdt(data) == -1) {
            perror("shmdt failed");
            exit(1);
        }

        exit(0);  // 子进程完成写入后退出
    } else {
        // 父进程等待子进程完成
        wait(NULL);

        // 父进程：读取共享内存中的数据
        char *data = (char*) shmat(shmid, NULL, 0);  // 连接到共享内存
        if (data == (char *)(-1)) {
            perror("shmat failed");
            exit(1);
        }

        printf("父进程：读取共享内存中的数据...\n");
        printf("父进程：读取的数据为：%s\n", data);

        // 分离共享内存
        if (shmdt(data) == -1) {
            perror("shmdt failed");
            exit(1);
        }

        // 删除共享内存段
        if (shmctl(shmid, IPC_RMID, NULL) == -1) {
            perror("shmctl failed");
            exit(1);
        }
    }

    return 0;
}
